home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / misc / pdflib / p_gstate.c < prev    next >
C/C++ Source or Header  |  1999-01-01  |  3KB  |  176 lines

  1. /* p_gstate.c
  2.  * Copyright (C) 1997-98 Thomas Merz. All rights reserved.
  3.  *
  4.  * PDFlib routines dealing with the graphics states
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <math.h>
  9.  
  10. #include "p_intern.h"
  11.  
  12. /* Section 8.3 Special Graphics State */
  13.  
  14. void
  15. PDF_save(PDF *p)
  16. {
  17.     pdf_end_text(p);
  18.     (void) fputs("q\n", p->fp);
  19. }
  20.  
  21. void
  22. PDF_restore(PDF *p)
  23. {
  24.     pdf_end_text(p);
  25.     (void) fputs("Q\n", p->fp);
  26. }
  27.  
  28. void
  29. pdf_concat(PDF *p, PDF_matrix m)
  30. {
  31.     pdf_end_text(p);
  32.     (void) fprintf(p->fp,"%s %s %s %s %s %s cm\n",
  33.           pdf_float(m.a), pdf_float(m.b), pdf_float(m.c),
  34.           pdf_float(m.d), pdf_float(m.e), pdf_float(m.f));
  35. }
  36.  
  37. /* Convenience routines */
  38.  
  39. void
  40. PDF_translate(PDF *p, float tx, float ty)
  41. {
  42.     (void) fprintf(p->fp,"1 0 0 1 %s %s cm\n", pdf_float(tx), pdf_float(ty));
  43.  
  44. }
  45.  
  46. void
  47. PDF_scale(PDF *p, float sx, float sy)
  48. {
  49.     (void) fprintf(p->fp,"%s 0 0 %s 0 0 cm\n", pdf_float(sx), pdf_float(sy));
  50. }
  51.  
  52. void
  53. PDF_rotate(PDF *p, float phi)
  54. {
  55.     double c, s;
  56.  
  57.     if (phi == 0)
  58.     return;
  59.  
  60.     phi = phi * M_PI / 180;    /* convert to radians */
  61.  
  62.     c = cos(phi);
  63.     s = sin(phi);
  64.  
  65.     (void) fprintf(p->fp,"%s %s %s %s 0 0 cm\n",
  66.         pdf_float(c), pdf_float(s), pdf_float(-s), pdf_float(c));
  67. }
  68.  
  69. /* Section 8.4 General Graphics State */
  70.  
  71. void
  72. PDF_setdash(PDF *p, float d1, float d2)
  73. {
  74.     if (d1 < 0.0 || d2 < 0.0) {
  75.     pdf_error(p, PDF_WARN, "Negative dash values");
  76.     return;
  77.     }
  78.  
  79.     pdf_end_text(p);
  80.     if (d1 == 0.0 && d2 == 0.0)        /* both zero means solid line */
  81.     (void) fputs("[] 0 d\n", p->fp);
  82.     else
  83.     (void) fprintf(p->fp,"[%s %s] 0 d\n", pdf_float(d1), pdf_float(d2));
  84. }
  85.  
  86. void
  87. PDF_setpolydash(PDF *p, float *darray, int length)
  88. {
  89.     int i;
  90.  
  91.     if (length == 0 || length == 1) {    /* length == 0 or 1 means solid line */
  92.     (void) fputs("[] 0 d\n", p->fp);
  93.     return;
  94.     }
  95.  
  96.     /* sanity checks */
  97.     if (length < 0) {
  98.     pdf_error(p, PDF_WARN, "Negative dash array length");
  99.     return;
  100.     }
  101.  
  102.     for (i = 0; i < length; i++) {
  103.     if (darray[i] < 0.0) {
  104.         pdf_error(p, PDF_WARN, "Negative dash value");
  105.         return;
  106.     }
  107.     }
  108.  
  109.     pdf_end_text(p);
  110.     (void) fputs("[", p->fp);
  111.  
  112.     for (i = 0; i < length; i++) {
  113.     (void) fprintf(p->fp,"%s ", pdf_float(darray[i]));
  114.     }
  115.     (void) fputs("] 0 d\n", p->fp);
  116. }
  117.  
  118. void
  119. PDF_setflat(PDF *p, float flat)
  120. {
  121.     if (flat < 0.0 || flat > 100.0) {
  122.     pdf_error(p, PDF_WARN, "Illegal flat value");
  123.     return;
  124.     }
  125.  
  126.     pdf_end_text(p);
  127.     (void) fprintf(p->fp,"%s i\n", pdf_float(flat));
  128. }
  129.  
  130. void
  131. PDF_setlinejoin(PDF *p, byte join)
  132. {
  133. #define LAST_JOIN    2
  134.     if (join > LAST_JOIN) {
  135.         pdf_error(p, PDF_WARN, "Bogus line join value");
  136.         return;
  137.     }
  138.  
  139.     pdf_end_text(p);
  140.     (void) fprintf(p->fp,"%d j\n", join);
  141. #undef LAST_JOIN
  142. }
  143.  
  144. void
  145. PDF_setlinecap(PDF *p, byte cap)
  146. {
  147. #define LAST_CAP    2
  148.     if (cap > LAST_CAP) {
  149.         pdf_error(p, PDF_WARN, "Bogus line cap value");
  150.         return;
  151.     }
  152.  
  153.     pdf_end_text(p);
  154.     (void) fprintf(p->fp,"%d J\n", cap);
  155. #undef LAST_CAP
  156. }
  157.  
  158. void
  159. PDF_setmiterlimit(PDF *p, float miter)
  160. {
  161.     if (miter < 1.0) {
  162.         pdf_error(p, PDF_WARN, "Bogus miter limit");
  163.         return;
  164.     }
  165.  
  166.     pdf_end_text(p);
  167.     (void) fprintf(p->fp,"%s M\n", pdf_float(miter));
  168. }
  169.  
  170. void
  171. PDF_setlinewidth(PDF *p, float width)
  172. {
  173.     pdf_end_text(p);
  174.     (void) fprintf(p->fp,"%s w\n", pdf_float(width));
  175. }
  176.